package com.nodecollege.cloud.common.model;

import com.nodecollege.cloud.common.utils.Base64Utils;
import com.nodecollege.cloud.common.utils.RSAUtils;
import lombok.Data;

import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

@Data
public class RSA {
    /**
     * 公钥
     */
    private RSAPublicKey publicKey;
    /**
     * 私钥
     */
    private RSAPrivateKey privateKey;

    /**
     * 获取公钥字符串
     *
     * @return
     */
    public String getPublicKeyStr() {
        return Base64Utils.encode(publicKey.getEncoded());
    }

    /**
     * 获取私钥字符串
     *
     * @return
     */
    public String getPrivateKeyStr() {
        return Base64Utils.encode(privateKey.getEncoded());
    }

    /**
     * 公钥加密
     *
     * @param data 源数据
     */
    public byte[] encryptByPublicKey(byte[] data) {
        return RSAUtils.encryptByPublicKey(data, getPublicKeyStr());
    }

    /**
     * 私钥解密
     *
     * @param encryptedData 已加密数据
     */
    public byte[] decryptByPrivateKey(byte[] encryptedData) {
        return RSAUtils.decryptByPrivateKey(encryptedData, getPrivateKeyStr());
    }

    /**
     * 私钥加密
     *
     * @param data 源数据
     */
    public byte[] encryptByPrivateKey(byte[] data) {
        return RSAUtils.encryptByPrivateKey(data, getPrivateKeyStr());
    }

    /**
     * 公钥解密
     *
     * @param encryptedData 已加密数据
     */
    public byte[] decryptByPublicKey(byte[] encryptedData) {
        return RSAUtils.decryptByPublicKey(encryptedData, getPublicKeyStr());
    }

    /**
     * 使用私钥对数据进行签名
     *
     * @param data 已加密数据
     */
    public String sign(byte[] data) {
        return RSAUtils.sign(data, getPrivateKeyStr());
    }

    /**
     * 使用公钥校验数字签名
     *
     * @param data 已加密数据
     * @param sign 数字签名
     */
    public boolean verify(byte[] data, String sign) {
        return RSAUtils.verify(data, getPublicKeyStr(), sign);
    }
}
